package com.start.workflow.common.std;

import com.alibaba.fastjson2.JSONObject;
import com.start.workflow.common.enums.StartActHandlerStatus;
import com.start.workflow.common.model.StartActConfigModel;


/**
 * 表单配置加载器
 */
public interface IStartActFormStore extends IStartActType {
    /**
     * 类型全局唯一标识
     *
     * @return
     */
    @Override
    default String type() {
        return actFormType();
    }

    /**
     * 表单类型
     *
     * @return
     */
    String actFormType();

    /**
     * 表单类型名称
     *
     * @return
     */
    default String actFormTypeLabel() {
        return actFormType();
    }

    /**
     * 加载表单配置
     *
     * @param modelConfig 表单值
     * @return
     */
    JSONObject loadOption(StartActConfigModel modelConfig);

    /**
     * 保存数据
     *
     * @param modelConfig
     * @param procInstId  流程配置
     * @param status      流程状态
     * @param data        需要保存的数据
     * @return
     */
    String saveProcFormData(StartActConfigModel modelConfig, String procInstId, StartActHandlerStatus status, JSONObject data);

    /**
     * 保存数据
     *
     * @param modelConfig 流程配置
     * @param status      流程状态
     * @param data        需要保存的数据
     * @return
     */
    String saveProcTaskFormData(StartActConfigModel modelConfig, String procInstId, String taskInstId, StartActHandlerStatus status, JSONObject data);

    /**
     * 删除流程表单数据
     *
     * @param modelConfig
     * @param procInstId
     */
    void delProcFormData(StartActConfigModel modelConfig, String procInstId);

    /**
     * 删除流程流程用户任务表单数据
     *
     * @param modelConfig
     * @param procInstId
     */
    void delProcTaskFormData(StartActConfigModel modelConfig, String procInstId, String taskInstId);

    /**
     * 获取流程表单的数据
     *
     * @param modelConfig
     * @param procInstId
     * @return
     */
    JSONObject getProcFormData(StartActConfigModel modelConfig, String procInstId);

    JSONObject getProcTaskFormData(StartActConfigModel modelConfig, String procInstId, String taskInstId);


    /**
     * 流程状态变化
     *
     * @param modelConfig
     * @param status      流程状态
     * @param procInstId  流程实例id
     */
    void onActProcStateChange(StartActConfigModel modelConfig, StartActHandlerStatus status, String procInstId);

    /**
     * 流程状态变化
     *
     * @param modelConfig
     * @param status      流程状态
     * @param procInstId  流程实例id
     * @param taskInst    数据id
     */
    void onActProcTaskStateChange(StartActConfigModel modelConfig, StartActHandlerStatus status, String procInstId, String taskInst);

    /**
     * 查询指定流程实例指定任务第定义key数据数量
     *
     * @param modelConfig 配置
     * @param procInstId  流程实例id
     * @param taskDefKey  流程定义key
     * @return
     */
    long countProcTaskDataByDefKey(StartActConfigModel modelConfig, String procInstId, String taskDefKey);

    /**
     * 删除指定流程实例自定任务定义key数据
     *
     * @param modelConfig 配置
     * @param procInstId  流程实例id
     * @param taskDefKey  流程定义key
     * @return
     */
    long delProcTaskDataByDefKey(StartActConfigModel modelConfig, String procInstId, String taskDefKey);


}
